﻿using System;

namespace Dexter.Logger.Contracts {
	/// <summary>
	/// 	Contract for the logger implementation
	/// </summary>
	public interface ILogger {
		/// <summary>
		/// 	Gets a value indicating whether this instance is debug enabled.
		/// </summary>
		/// <value>
		/// 	<c>true</c> if this instance is debug enabled; otherwise, <c>false</c>.
		/// </value>
		bool IsDebugEnabled { get; }

		/// <summary>
		/// 	Gets a value indicating whether this instance is error enabled.
		/// </summary>
		/// <value>
		/// 	<c>true</c> if this instance is error enabled; otherwise, <c>false</c>.
		/// </value>
		bool IsErrorEnabled { get; }

		/// <summary>
		/// 	Gets a value indicating whether this instance is fatal enabled.
		/// </summary>
		/// <value>
		/// 	<c>true</c> if this instance is fatal enabled; otherwise, <c>false</c>.
		/// </value>
		bool IsFatalEnabled { get; }

		/// <summary>
		/// 	Gets a value indicating whether this instance is info enabled.
		/// </summary>
		/// <value>
		/// 	<c>true</c> if this instance is info enabled; otherwise, <c>false</c>.
		/// </value>
		bool IsInfoEnabled { get; }

		/// <summary>
		/// 	Gets a value indicating whether this instance is warn enabled.
		/// </summary>
		/// <value>
		/// 	<c>true</c> if this instance is warn enabled; otherwise, <c>false</c>.
		/// </value>
		bool IsWarnEnabled { get; }

		/// <summary>
		/// 	Debugs the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		void Debug ( string message );


		/// <summary>
		/// 	Debugs the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		/// <param name = "exception">The exception.</param>
		void Debug ( string message , Exception exception );

		/// <summary>
		/// 	Debugs the format.
		/// </summary>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void DebugFormat ( string format , params object[] args );

		/// <summary>
		/// 	Debugs the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void DebugFormat ( Exception exception , string format , params object[] args );

		/// <summary>
		/// 	Debugs the format.
		/// </summary>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void DebugFormat ( IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Debugs the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void DebugFormat ( Exception exception , IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Errors the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		void Error ( string message );

		/// <summary>
		/// 	Errors the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		/// <param name = "exception">The exception.</param>
		void Error ( string message , Exception exception );

		/// <summary>
		/// 	Errors the format.
		/// </summary>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void ErrorFormat ( string format , params object[] args );

		/// <summary>
		/// 	Errors the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void ErrorFormat ( Exception exception , string format , params object[] args );

		/// <summary>
		/// 	Errors the format.
		/// </summary>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void ErrorFormat ( IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Errors the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void ErrorFormat ( Exception exception , IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Fatals the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		void Fatal ( string message );

		/// <summary>
		/// 	Fatals the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		/// <param name = "exception">The exception.</param>
		void Fatal ( string message , Exception exception );

		/// <summary>
		/// 	Fatals the format.
		/// </summary>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void FatalFormat ( string format , params object[] args );

		/// <summary>
		/// 	Fatals the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void FatalFormat ( Exception exception , string format , params object[] args );

		/// <summary>
		/// 	Fatals the format.
		/// </summary>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void FatalFormat ( IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Fatals the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void FatalFormat ( Exception exception , IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Infoes the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		void Info ( string message );

		/// <summary>
		/// 	Infoes the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		/// <param name = "exception">The exception.</param>
		void Info ( string message , Exception exception );

		/// <summary>
		/// 	Infoes the format.
		/// </summary>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void InfoFormat ( string format , params object[] args );

		/// <summary>
		/// 	Infoes the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void InfoFormat ( Exception exception , string format , params object[] args );

		/// <summary>
		/// 	Infoes the format.
		/// </summary>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void InfoFormat ( IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Infoes the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void InfoFormat ( Exception exception , IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Warns the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		void Warn ( string message );

		/// <summary>
		/// 	Warns the specified message.
		/// </summary>
		/// <param name = "message">The message.</param>
		/// <param name = "exception">The exception.</param>
		void Warn ( string message , Exception exception );

		/// <summary>
		/// 	Warns the format.
		/// </summary>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void WarnFormat ( string format , params object[] args );

		/// <summary>
		/// 	Warns the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void WarnFormat ( Exception exception , string format , params object[] args );

		/// <summary>
		/// 	Warns the format.
		/// </summary>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void WarnFormat ( IFormatProvider formatProvider , string format , params object[] args );

		/// <summary>
		/// 	Warns the format.
		/// </summary>
		/// <param name = "exception">The exception.</param>
		/// <param name = "formatProvider">The format provider.</param>
		/// <param name = "format">The format.</param>
		/// <param name = "args">The args.</param>
		void WarnFormat ( Exception exception , IFormatProvider formatProvider , string format , params object[] args );
		
		/// <summary>
		/// 	Gets the global properties.
		/// </summary>
		/// <value>The global properties.</value>
		IContextProperties GlobalProperties { get; }

		/// <summary>
		/// 	Gets the thread properties.
		/// </summary>
		/// <value>The thread properties.</value>
		IContextProperties ThreadProperties { get; }

		/// <summary>
		/// 	Gets the thread stacks.
		/// </summary>
		/// <value>The thread stacks.</value>
		IContextStacks ThreadStacks { get; }
	}
}